package IOTest.exercise;

import java.io.*;
import java.util.Arrays;
import java.util.Scanner;

//扫描指定⽬录，并找到名称或者内容中包含指定字符的所有普通⽂件（不包含⽬录）
public class Three {
    public static void main(String[] args) {
        //1、需要扫描的路径
        Scanner scanner = new Scanner(System.in);
        System.out.println("要查询的目录路径：");
        String rootPath = scanner.next();
        File file = new File(rootPath);
        System.out.println("要查询的关键字：");
        String keyword = scanner.next();

        //2、判断输入的合法性
        if(keyword.isEmpty()){
            System.out.println("关键词为空！");
            return;
        }
        if(!file.isDirectory()){
            System.out.println("路径错误");
            return;
        }

        //查找
        research(file,keyword);
    }
    private static void research(File file,String keyword){
        File[] files = file.listFiles();
        if(files == null){
            return;
        }
        //判断是文件夹还是普通文件
        for (int i = 0; i < files.length; i++) {
            if(files[i].isFile()){
                tryresearch(files[i],keyword);//普通文件进入方法，匹配关键字
            }else {
                research(files[i],keyword);//一层一层的递归遍历文件
            }
        }

    }
    private static void tryresearch(File file,String keyword){
        if(file.getName().contains(keyword)){
            System.out.println("找到文件，路径："+file.getPath());
            return;
        }
        try(Reader inputStream = new FileReader(file.getPath())){
            StringBuilder result = new StringBuilder();
            while (true){
                char[] chars = new char[1024];
                int n = inputStream.read(chars);
                if(n == -1){
                    break;
                }
                result.append(chars);//将文件内容拼成一个字符串
                if(result.indexOf(keyword) >= 0){//利用indexOf查找字符串位置，没找到返回负值
                    System.out.println("内容匹配成功，路径为："+file.getPath());
                }else {
                    return;
                }
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
